package com.cqq.common.core.util;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;

/**
 * <h3>字符串工具类</h3>
 * 
 * @author xijq
 * @version 1.0.0
 * 
 */
public class StringUtil {

	/**
	 * <h3>指定分隔符将字符串解析处理，并封装成对象List</h3>
	 * 
	 * @param <T> 目标对象类型
	 * @param str 待处理字符串
	 * @param separator 分隔符
	 * @param targetType 目标对象类型
	 * 
	 * @return 目标对象列表
	 */
	public static <T> List<T> buildList(String str,String separator,Class<T> targetType){
		if(str==null){
			return null;
		}
		if(separator==null || targetType==null){
			throw new IllegalArgumentException();
		}

		Constructor<T> con=null;
		try {
			con = targetType.getConstructor(String.class);
		} catch (Exception e) {
			throw new IllegalArgumentException(e);
		}
		
		List<T> list=new ArrayList<T>();
		try{
			String[] array=str.split(separator);
			for(String s:array){
				if(s.trim().length()==0){
					continue;
				}
				list.add(con.newInstance(s));
			}
		} catch (Exception e) {
			throw new IllegalArgumentException(e);
		}
		
		return list;
	}
	
	/**
	 * <h3>指定分隔符将字符串解析处理，并封装成对象数组</h3>
	 * 
	 * @param <T> 目标对象类型
	 * @param str 待处理字符串
	 * @param separator 分隔符
	 * @param targetType 目标对象类型
	 * 
	 * @return 目标对象数组
	 */
	@SuppressWarnings("unchecked")
	public static <T> T[] buildArray(String str,String separator,Class<T> targetType){
		List<T> list=buildList(str,separator,targetType);
		if(list==null){
			return null;
		}
		
		T[] t=(T[]) Array.newInstance(targetType, list.size());
		return list.toArray(t);
	}
	
	/**
	 * <h3>指定分隔符将List对象连接成字符串</h3>
	 * 
	 * @param <T> List存放的对象类型
	 * @param list 列表对象
	 * @param separator 分隔符
	 * 
	 * @return 连接后的字符串
	 */
	public static <T> String join(List<T> list,String separator){
		if(list==null){
			return null;
		}
		if(list.isEmpty()){
			return "";
		}
		StringBuffer sb=new StringBuffer();
		for(T t:list){
			sb.append(t).append(separator);
		}
		return sb.substring(0,sb.lastIndexOf(separator));
	}
	
	/**
	 * <h3>指定分隔符将数组对象连接成字符串</h3>
	 * 
	 * @param <T> 数组对象类型
	 * @param array 数组对象
	 * @param separator 分隔符
	 * 
	 * @return 连接后的字符串
	 */
	public static <T> String join(T[] array,String separator){
		if(array==null){
			return null;
		}
		if(array.length==0){
			return "";
		}
		StringBuffer sb=new StringBuffer();
		for(T t:array){
			sb.append(t).append(separator);
		}
		return sb.substring(0,sb.lastIndexOf(separator));
	}
	
}
